// 给定一个整数数组 A，如果它是有效的山脉数组就返回 true，否则返回 false。

// 让我们回顾一下，如果 A 满足下述条件，那么它是一个山脉数组：
// A.length >= 3
// 在 0 < i < A.length - 1 条件下，存在 i 使得：
// A[0] < A[1] < ... A[i-1] < A[i]
// A[i] > A[i+1] > ... > A[A.length - 1]
// 注意，最多只能有一个“山顶”出现

const validMountainArray = function (A: number[]): boolean {
    let left: number = 0;// 左指针
    let right: number = A.length - 1;// 右指针
    // 让左指针爬到山顶
    while (left + 1 < A.length && A[left + 1] >= A[left]) {
        left++;
    }
    // 让右指针爬到山顶
    while (right - 1 >= 0 && A[right - 1] > A[right]) {
        right--;
    }
    let res: boolean = (left === right && left != 0 && right != A.length - 1);
    return res;
};


validMountainArray([0, 3, 2, 1]);


// 这道题目也算是一道例题，正向遍历去思考的话会发现难度极大
// 因为有非常多的额外情况需要去考虑
// 但如果你想到了使用双指针的解法去求解这道题目，那么整个思考的逻辑会顺畅许多
// 我们让首尾两个指针去爬山。
// 左指针能爬高，就右移。
// 右指针能爬高，就左移。
// 爬高的过程中，左指针只需要满足非严格递增即可，而右指针按题目要求需要满足严格递增。
// 当指针停止爬高时，指向的元素就是山顶。
// 但要满足题目条件需要保证这个山顶不处在数组两端。即，两个指针必须经历爬高阶段，才指向山顶。
// 这也变相排除了数组长度小于 3 的情况，因为我们至少有左右端点和山顶，三个点。
// 同时，因为只有一个山峰，所以左右指针最后指向的山峰应该是相同的。
